#include <iostream>
using namespace std;

// 顺序栈结构体定义
typedef struct {
    char *base; // 栈底指针
    char *top;  // 栈顶指针
    int stackSize; // 栈的大小
}SqStack;

// 初始化栈
void initStack(SqStack &s, int size) 
{
    s.base = (char*)malloc(sizeof(char) * size);
    s.top = s.base;
    s.stackSize = size;
}

// 判断栈是否非空
bool isStackEmpty(SqStack s) {
    return s.top == s.base;
}

// 入栈操作
void push(SqStack &s, char x) {
    if (s.top - s.base == s.stackSize) {
        // 栈满
        cout << "栈满" << endl;
        exit(1);
    }
    *s.top++ = x;
}

// 出栈操作
char pop(SqStack &s) {
    if (isStackEmpty(s)) {
        // 栈空
        cout << "栈空" << endl;
        exit(1);
    }
    return *--s.top;
}

// 释放栈
void destroyStack(SqStack &s) 
{
    free(s.base);
}

int main() {
    SqStack s;
    initStack(s, 10);

    // 初始化栈
    cout << "初始化栈 s..." << endl;

    // 判断栈是否非空
    if (isStackEmpty(s)) {
        cout << "栈 s 为空" << endl;
    } else {
        cout << "栈 s 非空" << endl;
    }

    // 依次进栈元素 a、b、c、d、e
    push(s, 'a');
    push(s, 'b');
    push(s, 'c');
    push(s, 'd');
    push(s, 'e');

    // 判断栈是否非空
    if (isStackEmpty(s)) {
        cout << "栈 s 为空" << endl;
    } else {
        cout << "栈 s 非空" << endl;
    }

    // 输出出栈序列
    while (!isStackEmpty(s)) {
        cout << pop(s) << " ";
    }
    cout << endl;

    // 判断栈是否非空
    if (isStackEmpty(s)) {
        cout << "栈 s 为空" << endl;
    } else {
        cout << "栈 s 非空" << endl;
    }

    // 释放栈
    destroyStack(s);

    return 0;
}
